/*
author: jiangsujian
function: 采用go内置的rpc包实现简单功能
*/
// rpc开发三步走：1、实例化server ---> 2、注册处理逻辑handle ---> 3、启动服务
// go语言的rpc的序列化和反序列化的协议：Gob
package main

import (
	"net"
	"net/rpc"
)

// HelloService 定义一个简单结构体
type HelloService struct{}

// Hello 给结构体封装方法
func (s *HelloService) Hello(request string, reply *string) error {
	//修改入参指向的值
	*reply = "Hello " + request
	return nil
}

func main() {
	//1、实例化server ,采用net来实例化server,并指定地址端口及端口协议
	listener, err := net.Listen("tcp", ":1234")
	if err != nil {
		panic("failed to listen: " + err.Error())
	}
	//将结构体HelloService{}对象注册到rpc中，名称(随便)：HelloService_1 ( 这里是2、注册处理逻辑handle )
	_ = rpc.RegisterName("HelloService_1", &HelloService{})
	//3、启动一个服务，刚才的listener接收请求，相当新的请求进来
	conn, err := listener.Accept()
	if err != nil {
		panic("failed to accept connection" + err.Error())
	}
	//将请求的socket给到rp后续处理，即将net和rpc关联起来
	rpc.ServeConn(conn)
	//缺点：只能处理一次请求
}
